package br.ucb.tcc.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;

import net.java.dev.designgridlayout.DesignGridLayout;
import thinlet.swing.border.LineBorder;
import thinlet.swing.container.ToolFooter;
import thinlet.swing.table.Cell;
import thinlet.swing.table.Table;
import twitter4j.ResponseList;
import twitter4j.TwitterException;
import twitter4j.User;
import br.ucb.tcc.entidades.Perfil;
import br.ucb.tcc.entidades.Relacionamento;
import br.ucb.tcc.negocio.TwitterBean;
import br.ucb.tcc.persistencia.TwitterDAO;
import br.ucb.tcc.utils.Constantes;
import br.ucb.tcc.utils.ExcelUtil;
import br.ucb.tcc.utils.StringUtil;

/**
 * @author italoricci
 * 
 */
public class BuscarUsuarioBancoPanel extends AbstractPanel implements Table.Listener<Perfil>, ActionListener {

	private Table<Perfil> lista;
	private List<Perfil> perfilDTOs;
	private ToolFooter subPanelHeader;
	private JTextField campoPesquisa;
	private JTextField campoLocalizacaoPesquisa;
	private JTextField campoScreenName;
	private JTextField campoQuantidadeSeguidores;
	private JTextField campoQuantidadeAmigos;
	private JTextField campoUltimoTweet;
	private JButton pesquisarButton;
	private JButton gerarExcelButton;
	private JButton limparPesquisaButton;
	private JScrollPane scrollPane;
	private JPanel jPanel;

	/**
	 * 
	 */
	public BuscarUsuarioBancoPanel() {
		super(new BorderLayout());
		URL imgsrc = Main.class.getResource("icon/twitter-banner.jpg");
		JPanel header = new JPanel(new BorderLayout());
		subPanelHeader = new ToolFooter();
		JLabel lbHeader = new JLabel("<html><body>" + "<table><tr><td>" + "<img width='650' height='100' src='"
				+ imgsrc + "'></img>" + "</td><td><h3>Pesquisar usuários</h3></td></tr></table></body></html>");
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 0, 0, 0, 0, 0, 0));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);
		header.add(lbHeader, BorderLayout.CENTER);
		header.add(subPanelHeader, BorderLayout.SOUTH);
		JPanel panel = new JPanel();
		panel.setBorder(BorderFactory.createEmptyBorder());
		panel.setLayout(new BorderLayout());
		panel.add(header, BorderLayout.NORTH);
		panel.add(panelPesquisa(), BorderLayout.CENTER);
		add(panel, BorderLayout.NORTH);
		popularLista();
		scrollPane = new JScrollPane(lista);
		scrollPane.setBorder(BorderFactory.createEmptyBorder());
		add(scrollPane, BorderLayout.CENTER);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see thinlet.swing.table.Table.Listener#doubleClicked(java.lang.Object)
	 */
	@Override
	public void doubleClicked(Perfil arg0) {
		JLabel lbHeader = new JLabel(montarDetalhamento(arg0));
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 1, 0, 0, 8, 8, 8));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);
		JOptionPane.showMessageDialog(null, lbHeader, "Detalhamento de Usuário", JOptionPane.PLAIN_MESSAGE, null);
	}

	/**
	 * @return
	 */
	public JPanel panelPesquisa() {
		if (jPanel == null) {
			jPanel = new JPanel();
			DesignGridLayout designGridLayout = new DesignGridLayout(jPanel);
			designGridLayout.row().grid(new JLabel("Nome exibição:")).add(getCampoPesquisa());
			designGridLayout.row().grid(new JLabel("Perfil:")).add(getCampoScreenName());
			designGridLayout.row().grid(new JLabel("Localização:")).add(getCampoLocalizacaoPesquisa());
			designGridLayout.row().grid(new JLabel("Quantidade de Amigos:")).add(getCampoQuantidadeAmigos());
			designGridLayout.row().grid(new JLabel("Quantidade de Seguidores:")).add(getCampoQuantidadeSeguidores());
			designGridLayout.row().grid(new JLabel("Último Tweet:")).add(getCampoUltimoTweet());
			designGridLayout.row().center().add(getPesquisarButton()).add(getExportarParaExcelButton()).add(getLimparPesquisaButton());

		}
		return jPanel;
	}

	/**
	 * 
	 */
	public void popularLista() {
		lista = new Table<Perfil>();
		lista.setCells(Perfil.class, new Cell("nomePerfil").setColor(new Color(0x4a77ce)), new Cell("nomeExibicao")
				.setColor(new Color(0x4a77ce)), new Cell("localizacao").setColor(new Color(0x4a77ce)), new Cell(
				"qtdAmigos").setColor(new Color(0x4a77ce)), new Cell("qtdSeguidores").setColor(new Color(0x4a77ce)),
				new Cell("ultimoPost").setColor(new Color(0x4a77ce)));
		lista.addListListener(this);
	}

	/**
	 * @param perfis
	 */
	public void updateLista(List<Perfil> perfis) {
		popularLista();
		this.remove(scrollPane);
		for (Perfil perfilDTO : perfis) {
			lista.addItem(perfilDTO);
		}
		scrollPane = new JScrollPane(lista);
		scrollPane.setBorder(BorderFactory.createEmptyBorder());
		add(scrollPane, BorderLayout.CENTER);
		this.revalidate();
	}

	/**
	 * 
	 */
	public void limparLista() {
		lista.setModel(null);
		lista.repaint();
		this.revalidate();
	}

	/**
	 * @return
	 */
	public JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
		}
		return scrollPane;
	}

	/**
	 * @return
	 */
	public ToolFooter getSubPanelHeader() {
		if (subPanelHeader == null) {
			subPanelHeader = new ToolFooter();
		}

		return subPanelHeader;
	}

	/**
	 * @return
	 */
	public JTextField getCampoPesquisa() {
		if (campoPesquisa == null) {
			campoPesquisa = new JTextField(10);
			campoPesquisa.setBounds(10, 10, 10, 10);
		}
		return campoPesquisa;
	}

	/**
	 * @return the campoScreenName
	 */
	public JTextField getCampoScreenName() {
		if (campoScreenName == null) {
			campoScreenName = new JTextField(10);
		}
		return campoScreenName;
	}

	/**
	 * @return the campoQuantidadeSeguidores
	 */
	public JTextField getCampoQuantidadeSeguidores() {
		if (campoQuantidadeSeguidores == null) {
			campoQuantidadeSeguidores = new JTextField(10);
		}
		return campoQuantidadeSeguidores;
	}

	/**
	 * @return the campoQuantidadeAmigos
	 */
	public JTextField getCampoQuantidadeAmigos() {
		if (campoQuantidadeAmigos == null) {
			campoQuantidadeAmigos = new JTextField(10);
		}
		return campoQuantidadeAmigos;
	}

	/**
	 * @return the campoUltimoTweet
	 */
	public JTextField getCampoUltimoTweet() {
		if (campoUltimoTweet == null) {
			campoUltimoTweet = new JTextField(10);
		}
		return campoUltimoTweet;
	}

	/**
	 * @return the campoLocalizacaoPesquisa
	 */
	public JTextField getCampoLocalizacaoPesquisa() {
		if (campoLocalizacaoPesquisa == null) {
			campoLocalizacaoPesquisa = new JTextField(10);
		}
		return campoLocalizacaoPesquisa;
	}

	/**
	 * @return the jPanel
	 */
	public JPanel getjPanel() {
		return jPanel;
	}

	public JButton getExportarParaExcelButton() {
		if (gerarExcelButton == null) {
			gerarExcelButton = new JButton("Export para Excel");
			gerarExcelButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					if (perfilDTOs != null && !perfilDTOs.isEmpty()) {
						ExcelUtil<Perfil> exportador = new ExcelUtil<Perfil>();
						exportador.montarExcel(perfilDTOs, "id", "nomePerfil", "nomeExibicao", "localizacao",
								"qtdSeguidores", "qtdAmigos", "ultimoPost");
						mostrarMensagemInformativa("Arquivo gerado com sucesso no seguinte caminho>>" + Constantes.PATH
								+ Constantes.NOME_EXCEL_GERADO, "Mensagem");
					} else {
						mostrarMensagem("Necessário efetuar uma pesquisa antes.");
					}
				}
			});
		}
		return gerarExcelButton;
	}

	/**
	 * @return
	 */
	public JButton getPesquisarButton() {
		if (pesquisarButton == null) {
			pesquisarButton = new JButton();
			pesquisarButton.setText("Pesquisar Usuário");
			pesquisarButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					try {
						TwitterDAO perfilDAO = new TwitterDAO();
						perfilDTOs = perfilDAO.buscarPorCriterio(getCampoPesquisa().getText(), getCampoScreenName()
								.getText(), getCampoQuantidadeAmigos().getText(), getCampoQuantidadeSeguidores()
								.getText(), getCampoLocalizacaoPesquisa().getText(), getCampoUltimoTweet().getText());
						if (perfilDTOs != null && !perfilDTOs.isEmpty()) {
							updateLista(perfilDTOs);
						} else {
							mostrarMensagemInformativa("Nenhum registro encontrado", "Alerta");
							updateLista(new ArrayList<Perfil>(0));
						}
					} catch (Exception e) {
						mostrarMensagemInformativa(e.getMessage(), "Alerta");
					}
				}
			});
		}
		return pesquisarButton;
	}

	/**
	 * @return
	 */
	public JButton getLimparPesquisaButton() {
		if (limparPesquisaButton == null) {
			limparPesquisaButton = new JButton();
			limparPesquisaButton.setText("Limpar");
			limparPesquisaButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					getCampoPesquisa().setText(null);
					getCampoScreenName().setText(null);
					getCampoQuantidadeAmigos().setText(null);
					getCampoQuantidadeSeguidores().setText(null);
					getCampoLocalizacaoPesquisa().setText(null);
					getCampoUltimoTweet().setText(null);
					updateLista(new ArrayList<Perfil>(0));
				}
			});
		}
		return limparPesquisaButton;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * thinlet.swing.table.Table.Listener#selectionChanged(javax.swing.event
	 * .ListSelectionEvent)
	 */
	@Override
	public void selectionChanged(ListSelectionEvent arg0) {
		// TODO Auto-generated method stub

	}

}
